home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 003 / dbapg.arc / PRINTREF.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-07-08  |  4.6 KB  |  141 lines

  1. ; Subroutine.: PRINTREF.ASM
  2. ; Author.....: Roy M. Moore
  3. ; Date.......: 11/01/83
  4. ; Notice.....: Copyright 1983, All Rights Reserved
  5. ; Notes......: Locates delimiters of a character string.
  6. ;              Used with PRINTREF.CMD 
  7. ;
  8. ;
  9.         ORG  42000
  10. SAVPOS  DB   0            ; PREVIOUS PARSED POSITION IN STRING
  11. EOSFLG    DB   0            ; END-OF-STRING FLAG
  12. OFFSET  DB   0            ; OFFSET POSITION INTO THE STRING 
  13. ERRFLG  DB   0          ; ERROR FLAG
  14. ;
  15.         ORG  42005           ; START OF ROUTINE
  16. ;
  17.         SHLD SAVEHL         ; SAVE H-L REGISTERS
  18.         MOV  A,M          ; STORE STRING LENGTH TO ACCUM.
  19.         STA  STRLEN         ; SAVE LENGTH + 1 
  20.         LDA  SAVPOS         ; FETCH PREVIOUS PARSED POSITION
  21.         MOV  C,A          ; INITIALIZE B-C REGISTER PAIR
  22.         MVI  B,0          ;   
  23.         DAD  B             ; ADD B-C VALUE TO H-L REG PAIR
  24.         XCHG             ; POINT D-E AT STRING
  25.     LDA  STRLEN         ; FETCH STRING LENGTH 
  26.         MOV  B,A          ; SAVE STRING LENGTH TO B-REG
  27. ;
  28. GETCH:  
  29.         INX  D             ; GET NEXT CHAR IN D-E ADDRESS
  30.         INR  B             ; INCREMENT STRING COUNTER
  31.         LDA  STRLEN         ; LOAD THE STRING LENGTH
  32.         CMP  B             ; IS IT END-OF-STRING?
  33.         JNZ  GETCH2         ; NO, CHECK FOR STRING DELIMITERS
  34.     CALL SETOFF         ; SAVE OFFSET POSITION
  35.     JMP  FINSTR         ; FINISHED
  36. ;
  37. ; FIND CHARACTER STRING DELIMITERS. "...", '...', [...]
  38. ;
  39. GETCH2:
  40.         LDAX D             ; LOAD ACCUMULATOR WITH CHAR
  41.         CPI  22H          ; IS IT " 
  42.         JZ   STRDEL         ; YES, FIND NEXT "
  43.         CPI  27H          ; IS IT '
  44.         JZ   STRDEL          ; YES, FIND NEXT '
  45.         CPI  '['          ; IS IT [
  46.     JNZ  CHKDEL
  47.     MOV  C,']'         ; YES, FIND ]
  48. ;
  49. ; FIND THE NEXT STRING DELIMITER.
  50. ;
  51. STRDEL:  
  52.      MOV  C,A             ; SAVE THE DELIMITER IN C-REG
  53.     INX  D             ; POINT TO NEXT CHAR
  54.         INR  B             ; ADJUST CHAR COUNTER
  55.         LDAX D             ; PREPARE TO COMPARE
  56.         CMP  C           ; IS IT THE NEXT STRING DELIMITER
  57.     JZ   GETCH         ; YES, GET ANOTHER CHAR
  58.         LDA  STRLEN         ; LOAD THE STRING LENGTH
  59.         CMP  B             ; IS IT END-OF-STRING?
  60.     JNZ  STRDEL          ; NO, KEEP LOOKING 
  61. ;
  62. ; REACHED THE END-OF-STRING WITHOUT FINDING
  63. ; THE MATCHING STRING DELIMITER.
  64. ;  
  65. STRERR:
  66.     MVI  A,1         ; SET ERROR FLAG TO TRUE
  67.     STA  ERRFLG          ; 
  68.     JMP  FINSTR         ; FINISHED
  69. ;
  70. ; LOOK FOR OTHER DELIMITERS.
  71. ;
  72. CHKDEL:
  73.         MVI  C,21         ; INITIALIZE DELIMITER COUNTER
  74.         LXI  H,DELIMS         ; POINT H-L AT DELIMITER
  75. CONTDL: 
  76.     CMP  M             ; IS IT A DELIMITER?
  77.         JZ   GETCH         ; YES, THIS DELIMITER IS USELESS
  78.                  ;   TO US, SO WE GET ANOTHER CHAR
  79.         INX  H             ; NO, THEN TRY ANOTHER DELIMITER
  80.         DCR  C             ; DECREMENT DELIMITER COUNTER
  81.         JNZ  CONTDL         ; CONTINUE CHECKING FOR DELIMITERS
  82.                  ;   IF MORE DELIMITERS AVAILABLE
  83. ;
  84. ; OUT OF DELIMITERS TO TEST.  SO, IT MUST BE
  85. ; THE FIRST CHARACTER OF A TOKEN.
  86. ;
  87.     CALL SETOFF         ; SAVE THIS POSITION TO OFFSET
  88. ;
  89. ; NOW, FIND THE NEXT DELIMITER.
  90. ;
  91. NEXTDL║
  92.         INX  D             ; GET NEXT CHAR IN D-E ADDRESS
  93.         INR  B             ; INCREMENT STRING COUNTER
  94.         LDA  STRLEN         ; LOAD THE STRING LENGTH
  95.         CMP  B             ; IS IT END-OF-STRING?
  96.     JZ   FINSTR         ; YES, FINISHED
  97. ;
  98.     MV╔  C,2▒         ╗ INITIALIZ┼ DELIMITE╥ COUNTER
  99.         LXI  H,DELIMS         ; POINT H-L AT DELIMITERS
  100. ;
  101. CHKDL2:  
  102.     CMP  M             ; IS IT A DELIMITER?
  103.         JZ   ATOKEN         ; YES, EXIT THE ROUTINE, BECAUSE
  104.                   ;   A TOKEN HAS BEEN TRAPPED
  105.         DCR  C             ; ANY MORE DELIMITERS TO CHECK?
  106.         JZ   NEXTDL         ; NO, THIS CHAR MUST BE PART OF
  107.                  ;   THE TOKEN.  THEREFORE, IGNORE 
  108.                  ;   THIS ONE AND GET ANOTHER CHAR
  109.         INX  H             ; YES, GET NEXT DELIMITER
  110.         JMP  CHKDL2         ;   AND TEST IT
  111. ;
  112. ; REACHED THE END-OF-STRING.
  113. ;
  114. FINSTR: 
  115.     MVI  A,1          ; SET END-OF-STRING FLAG
  116.         STA  EOSFLG         ;   FOR dBASE TO CHECK
  117. ;
  118. ATOKEN:   
  119.     MOV  A,B          ; B-REG HAS THE NUM OF CHARS PARSED
  120.         STA  SAVPOS         ; SAVE THE LAST POSITION
  121. ;
  122. RESTOR:
  123.         LHLD SAVEHL         ; RESTORE H-L REGISTERS
  124.         RET             ; RETURN TO dBASE II
  125. ; -----------------------------------------------------------
  126. ;
  127. ; SAVE OFFSET POSITION.
  128. ;
  129. SETOFF:
  130.         LDA  SAVPOS         ; LOAD PREVIOUS POSITION 
  131.         SUB  B             ; SUBTRACT THE CHAR POSITION
  132.         CMA             ; CONVERT FROM NEGATIVE TO POSITIVE
  133.         STA  OFFSET         ; SAVE IT TO THE OFFSET
  134.     RET
  135. ;
  136. SAVEHL  DB   0,0             ; SAVE H-L REGISTERS
  137. STRLEN  DB   0               ; STRING LENGTH
  138. DELIMS  DB   ' ()+-/*,;&$#<>=!@',22H,27H,5BH,5DH
  139. ;
  140. END
  141.